Skip to main content

tail command

tail - output the last part of files

The tail command in Linux is a handy utility used to display the end (bottom) of a file or input. It’s perfect for checking recent log entries, monitoring file changes, or sampling the last few lines of text.

Usage: tail [OPTION]... [FILE]...

  • OPTION: Flags which enhances the tail abilities.
  • FILE: The file(s) to read (optional; reads from input if omitted).

Print the last 10 lines of each FILE to standard output. With more than one FILE, precede each with a header giving the file name. With no FILE, or when FILE is -, read standard input.

Examples

  • Basic Usage

    By default, tail shows the last 10 lines of a file.

    $ tail logfile.txt
    • Prints the last 10 lines of logfile.txt.
    • If the file has fewer than 10 lines, it shows the entire file.
  • Specifying Number of Lines

    Use -n followed by a number to display a specific number of lines from the end.

    $ tail -n 5 logfile.txt
    • Shows the last 5 lines of logfile.txt.

    Shorthand:

    Omit -n and use a dash with a number:

    $ tail -5 logfile.txt
    • Same as above.
  • Specifying Bytes Instead of Lines

    Use -c to display a specific number of bytes from the end.

    $ tail -c 20 logfile.txt
    • Prints the last 20 bytes of logfile.txt (useful for binary files or precise cuts).
  • Following a File (Real-Time Updates)

    Use -f (follow) to monitor a file as it grows, like a live log.

    $ tail -f logfile.txt
    • Displays the last 10 lines and updates as new lines are added (e.g., for active logs).
    • Press Ctrl+C to stop.

    Start with Specific Lines:

    $ tail -n 2 -f logfile.txt
    • Shows the last 2 lines and follows from there.
  • Working with Multiple Files

    Pass multiple files to see the end of each one.

    $ tail file1.txt file2.txt
    • Output shows the last 10 lines of file1.txt, then file2.txt, with headers like ==> file1.txt <==.

    Quiet Mode:

    Use -q to suppress headers:

    $ tail -q -n 5 file1.txt file2.txt
    • Shows 5 lines from each file without headers.
  • Verbose Output

    Add -v to always show file headers, even for a single file.

    $ tail -v -n 5 logfile.txt
    • Output starts with ==> logfile.txt <== followed by the last 5 lines.
$ tail --help
Usage: tail [OPTION]... [FILE]...
Print the last 10 lines of each FILE to standard output.
With more than one FILE, precede each with a header giving the file name.

With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
-c, --bytes=[+]NUM output the last NUM bytes; or use -c +NUM to
output starting with byte NUM of each file
-f, --follow[={name|descriptor}]
output appended data as the file grows;
an absent option argument means 'descriptor'
-F same as --follow=name --retry
-n, --lines=[+]NUM output the last NUM lines, instead of the last 10;
or use -n +NUM to output starting with line NUM
--max-unchanged-stats=N
with --follow=name, reopen a FILE which has not
changed size after N (default 5) iterations
to see if it has been unlinked or renamed
(this is the usual case of rotated log files);
with inotify, this option is rarely useful
--pid=PID with -f, terminate after process ID, PID dies
-q, --quiet, --silent never output headers giving file names
--retry keep trying to open a file if it is inaccessible
-s, --sleep-interval=N with -f, sleep for approximately N seconds
(default 1.0) between iterations;
with inotify and --pid=P, check process P at
least once every N seconds
-v, --verbose always output headers giving file names
-z, --zero-terminated line delimiter is NUL, not newline
--help display this help and exit
--version output version information and exit

NUM may have a multiplier suffix:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
Binary prefixes can be used, too: KiB=K, MiB=M, and so on.

With --follow (-f), tail defaults to following the file descriptor, which
means that even if a tail'ed file is renamed, tail will continue to track
its end. This default behavior is not desirable when you really want to
track the actual name of the file, not the file descriptor (e.g., log
rotation). Use --follow=name in that case. That causes tail to track the
named file in a way that accommodates renaming, removal and creation.